package com.ly.nio;



import java.nio.ByteBuffer;

/**
 * @Classname NioBuffer
 * @Description
 * 缓冲区：在java nio中负责数据的存取，缓冲区就是数组。用于存储不同数据类型的数据
 *
 * 根据数据类型不同，提供了相应类型的缓冲区:
 * 8大基本数据类型，只有没有boolean的缓冲区
 * ByteBuffer
 * CharBuffer
 * ShortBuffer
 * FloatBuffer
 * DoubleBuffer
 * IntBuffer
 * LongBuffer
 *
 * 缓冲区存取数据的核心方法
 * put（）  存
 * get（）   取
 *
 *
 * 缓冲区的四大属性
 * capacity  容量
 * limit   界限，表示缓冲区可以操作数组的大小 （limit后数据不能读写）
 * position 位置，表示缓冲区中正在操作数据的位置
 * mark: 标记，表示记录当前position的位置，可以reset（）恢复到mark的位置
 *  mark <= position <= limit <= capacity
 *
 * 直接缓冲区与非直接缓冲区
 * 非直接缓冲区 通过 allocate（）方法分配缓冲区，实际上进行两次缓存，物理内存与JVM内存
 *  调用super(-1.txt, 0, lim, cap, new byte[cap], 0);   直接申请byte数组作为缓存空间
 * 直接缓冲区 通过 allocateDirect（）方法分配直接缓冲区，建立在物理内存中，实际上只有一次缓存，可以提高效率
 * 但是gc时才能断开连接  调用VM.isDirectMemoryPageAligned();  本地方法申请缓存空间
 *
 * @Date 2020/9/30 14:02
 * @Author 冷心影翼
 */
public class NioBuffer {

	public static void main(String[] args) {
//		test1();
		test2();
	}

	public static void test1() {
		ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024);

		System.out.println(byteBuffer.position());
		System.out.println(byteBuffer.limit());
		System.out.println(byteBuffer.capacity());
		System.out.println("-----------");
		byteBuffer.put("main/java/test".getBytes());
		System.out.println(byteBuffer.position());
		System.out.println(byteBuffer.limit());
		System.out.println(byteBuffer.capacity());
		System.out.println("-----------");
		// flip    position重置为 0，limit赋值为flip前position的位置
		byteBuffer.flip();
		System.out.println(byteBuffer.position());
		System.out.println(byteBuffer.limit());
		System.out.println(byteBuffer.capacity());
		System.out.println("-----------");
		byte [] bytes = new byte [byteBuffer.limit()];
		byteBuffer.get(bytes);

		String s1 = new String(bytes);
		System.out.println(s1);

		System.out.println(byteBuffer.position());
		System.out.println(byteBuffer.limit());
		System.out.println(byteBuffer.capacity());
		System.out.println("-----------");

		//重置position为0
		byteBuffer.rewind();

		//清空缓冲区，但数据还在
		byteBuffer.clear();
	}

	public static void test2() {
		ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
		byteBuffer.put("12345".getBytes());

		byteBuffer.flip();
		byte [] bytes = new byte [byteBuffer.limit()];
		byteBuffer.get(bytes,0,2);
		System.out.println(new String(bytes));

		byteBuffer.mark();

		byteBuffer.get(bytes,0,2);
		System.out.println(new String(bytes));

		byteBuffer.reset();
		byte [] bytes2 = new byte [byteBuffer.limit()];
		byteBuffer.get(bytes2,0,1);
		System.out.println(new String(bytes2));
	}

	public static void test3(){
		ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
		ByteBuffer byteBuffer1 = ByteBuffer.allocateDirect(1024);
	}
}
